home *** CD-ROM | disk | FTP | other *** search
- /*⁄ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒø
- ›≥ ≥
- ›≥ Program Name: PACKLOOK.PRG ≥
- ›≥ Purpose: Interface Pkzip files ≥
- ›≥ Language: Clipper 5.0 ≥
- ›≥ Original Author: Micheal Todd Charron Oct. 16 1990 ≥
- ›≥ Modified By: Kevin S. Gallagher Feb. 04 1993 ≥
- ›≥ ≥
- ›≥ The core routine is to read a PKzip compressed file, and return the ≥
- ›≥ following information: ≥
- ›≥ file_name - dos filename of each file in the zipfile ≥
- ›≥ file_date - dos date of last modification to "file_name" ≥
- ›≥ file_size - uncompressed and compressed bytes of "file_name" ≥
- ›≥ file_time - dos time stamp of "file_name" ≥
- ›≥ ratio - precentage 0 - 100% of original file size ≥
- ›≥ stored - how PKzip stored "file_name" ie. Deflated, Crunched etc.≥
- ›≥ ≥
- ›≥ Modifications were made to allow the core to read PKzip v2.nn ≥
- ›≥ and some simple screen I/O stuff. ≥
- ›¿ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒŸ
- flflflflflflflflflflflflflflflflflflflflflflflflflflflflflflflflflflflflflflflflflflflflflflflflflflflflflflflflflflflflflflflflflflflflflfl */
-
- //ƒƒƒƒƒ undefine test to remove the sample interface
- #define TEST
- //ƒƒƒƒƒ undefine use_help to remove the help function if not needed
- #define USE_HELP
- //ƒƒƒƒƒ review whats up before undefining KSG directive!
- #define KSG
-
- #ifdef KSG
- #include "include1.ch"
- #else
- #include "fileio.ch"
- #include "inkey.ch"
- #include "box.ch"
- #endif
-
- STATIC cWhichFile:=""
-
- #ifdef TEST
-
- STATIC aBar_ :={}, aFiles_ :={}, rel_ele := 0
-
- FUNCTION TestMe
- local SaveFullScreen(), oldcolor:= setcolor("w+/b,b/w"), xNum:=0,oldcurs
- local nTr:=10,nTc:=30,nBr:=15,nBc:=49
- aFiles_:= getfiles()
- ZoomBox(nTr-1,nTc-1,nBr+1,nBc+1,"W+/B" , 40, .T. )
- aBar_ := ScrollBarDisplay( { nTr, nBc+1, nBr, nBc+1, "gr+/b", 1 } )
- keyboard chr(255)
- WHILE LASTKEY() <> K_F10
- ACHOICE(nTr,nTc,nBr,nBc,aFiles_,,"ashell",rel_ele)
- ENDDO
- oldcurs :=setcursor( 0 )
- FOR xNum = 0 TO MR
- RESTSCREEN(0,0,xNum,MC,oldscrn)
- inkey(.1)
- NEXT
- setcursor( oldcurs )
- setcolor( oldcolor )
- @1,0
- @0,0 say PADR(" PK-LOOK created by Kevin S. Gallagher",80) color "n/bg"
- return nil
- FUNCTION ashell( status, curr_ele, nRight)
- local RetVal := 2, nKey := lastkey()
- DO CASE
- CASE status EQ 0 .OR. nKey EQ 255
- ScrollBarUpdate(aBar_,Curr_ele,len(aFiles_),TRUE)
- CASE status EQ 1
- keyboard CHR(K_CTRL_PGDN)
- RetVal := 2
- CASE status EQ 2
- keyboard CHR(K_CTRL_PGUP)
- RetVal := 2
- CASE nKey EQ K_ENTER
- ZIPPER(aFiles_[ curr_ele ])
- RetVal := 2
- CASE nKey EQ K_HOME
- keyboard CHR(K_CTRL_PGUP)
- CASE nKey EQ K_END
- keyboard CHR(K_CTRL_PGDN)
- CASE nKey EQ K_ESC .OR. nKey EQ K_F1
- alert("TO EXIT PROGRAM;PRESS FUNCTION KEY LABELED F10",{" OKAY "})
- RetVal := 2
- CASE nKey EQ K_F10
- RetVal := 0
- CASE nKey EQ K_LEFT
- keyboard CHR(K_DOWN)
- CASE nKey EQ K_RIGHT
- keyboard CHR(K_UP)
- CASE nKey EQ K_SPACEBAR
- RetVal := 2
- ENDCASE
- return RetVal
-
- FUNCTION getfiles
- local GetZips_:= DIRECTORY("*.ZIP"), aArr_:={}
- dispbox(0,0,MR,MC,replicate(chr(176),9),"w+/w")
- if LEN(GetZips_) EQ 0
- ALERT(" NO FILES FOUND TO PROCESS", {" QUIT "})
- QUIT
- endif
- AEVAL( GetZips_,{ | x | AADD(aArr_, x[1]) } )
- aArr_:=ASORT( aArr_ )
- return aArr_
- #endif
-
-
- FUNCTION ZIPPER( cCommandLine )
- local cInfo, aPacked:={}, cDefCol, cFName, nHand, nNoOfRows, xNum:=0
- local oldcur:=setcursor( 0 ), oldcolor:=setcolor("w+/b"), SaveFullScreen()
- local nTestHand:=0,cBuf:=space(5)
-
-
- nTestHand := FOPEN( cCommandLine )
- if FERROR() = 0
- FREAD(nTestHand, @cBuf, 5)
- FCLOSE( nTestHand )
- endif
- /*
- * Modifications to read all files within PKZIP v2.nn
- * -KSG 02/04/93
- */
-
- cInfo := ;
- { 30, 14, 13, 11, 12, 23, 19, ;
- { | cFileInfo | ( "PK"+ CHR( 3 ) + CHR( 4 ) ) $ cFileInfo }, ;
- { | cFileInfo | FileType( ASC( SUBS(cFileInfo,9,1) ) ) }, ;
- { | cFileInfo,nHand| cFName := SPACE( ASC( SUBS(cFileInfo,27,1))), ;
- FREAD(nHand,@cFName,LEN( cFName ) ),cFName } ;
- }
-
- nNoOfRows := PackInfo( cCommandLine, aPacked, cInfo)
-
- IF nNoOfRows EQ 0
- alert("CORRUPTION DETECTED IN ZIPFILE",{" ERROR "})
- ELSE
- BrowsePacked( aPacked, nNoOfRows, cCommandLine )
- ENDIF
- setcursor(oldcur)
- setcolor(oldcolor)
- FOR xNum = 0 TO MR
- RESTSCREEN(0,0,xNum,MC,oldscrn)
- inkey(.1)
- NEXT
- return nil
-
- FUNCTION PackInfo( cCommandLine, aPacked, aInfo )
- LOCAL cFileInfo, cFName, nFileCount := 0, nHandle := FOPEN(cCommandLine)
- LOCAL oldcolor := setcolor()
-
- WHILE .T.
- cFileInfo := SPACE( aInfo[ INFO_SIZE ] )
- FREAD( nHandle, @cFileInfo, aInfo[ INFO_SIZE ] )
-
- IF ! EVAL( aInfo[ CB_FINISHED ], cFileInfo )
- EXIT
- ENDIF
- nFileCount ++
- // Adds an undefined second dimension on to the array.
- AADD( aPacked, {} )
-
- // Evals the code block that reads the packed files file name.
- cFName := EVAL( aInfo[ CB_FILE_NAME ], cFileInfo, nHandle )
-
- // Get rid of "/" is directory name is stored in zipfile
- AADD(aPacked[ nFileCount ], SUBS( cFName, RAT( '/', cFName ) + 1 ) )
-
- AADD( aPacked[ nFileCount ], cFName )
-
- // Calc the Date of the file
- AADD( aPacked[ nFileCount ], ;
- CalcDate( ASC( SUBSTR( cFileInfo, ;
- aInfo[ POS_YEAR_MON ], 1 ) ), ;
- ASC( SUBSTR( cFileInfo, aInfo[ POS_MON_DAY ], 1 ) ) ) )
-
- // Calc the Time of the file
- AADD( aPacked[ nFileCount ], ;
- CalcTime( ASC( SUBSTR( cFileInfo, ;
- aInfo[ POS_MINUTES ], 1 ) ), ;
- ASC( SUBSTR( cFileInfo, aInfo[ POS_MIN_HOUR ], 1 ) ) ) )
-
- // Calc the size of the file before compression
- AADD( aPacked[ nFileCount ], ;
- BIN2L( SUBSTR( cFileInfo, aInfo[ POS_ORIGINAL ],4 ) ) )
-
- // Calc the size of the file after compression
- AADD( aPacked[ nFileCount ], ;
- BIN2L( SUBSTR( cFileInfo, aInfo[ POS_PACKED ], 4 ) ) )
-
- // Calc the ratio of the file compression to the fullSize of the file
- AADD( aPacked[ nFileCount ],;
- Ratio( aPacked[ nFileCount, F_ORIGINAL ], ;
- aPacked[ nFileCount, F_PACKED ] ) )
-
- // Fills the element with the type of the compression
- AADD( aPacked[ nFileCount ], EVAL( aInfo[ CB_FILE_TYPE ], ;
- cFileInfo ) )
-
- // Inserts the position of the file in the pack file
- AADD( aPacked[ nFileCount ], nFileCount )
-
- // Moves the file pointer to the next section
- FSEEK( nHandle, aPacked[ nFileCount, F_PACKED ], FS_RELATIVE )
-
- ENDDO
-
- /*
- * Returns the number of files found in order to pass the value to
- * the tbrowse function. This is for control of the boundrys of array.
- */
- RETURN nFileCount
-
- FUNCTION BrowsePacked( aPacked, nLenArray, cCommandLine )
- LOCAL cDefCol, cDefColor, cHilite, cNoOfFiles, jj, nArrPos := 1, nKey, c
- LOCAL oHeadColor, cMsg:="", TBar_:={},nTr:=2, nTc:=3, nBr:=19, nBc:=74
- LOCAL nLeftCol, nRightCol, nSortPick, b:= TBROWSENEW( 2, 3, 19, 74 )
-
- ZoomBox(1,2,21,75,"W+/B" , 5, .T. )
- //
- // attach scrollbar to browse
- //
- TBar_ := ScrollBarDisplay( { nTr+1, nBc+1, nBr, nBc+1, "w+/b", 1 } )
- //
- cWhichFile := UPPER( RTRIM( cCommandLine ) )
- cDefColor := SETCOLOR( "gr+/b" )
- @20, 5 SAY UPPER( cCommandLine )
- cNoOfFiles := LTRIM( STR( nLenArray ) ) + " Files"
- @20, ( 73 - LEN( cNoOfFiles ) ) SAY cNoOfFiles
-
- b:HEADSEP := "¬ƒ"
- b:COLSEP := "≥"
- b:FOOTSEP := "¡ƒ"
- b:COLORSPEC:="w+/b,w+/n,w+/b,w+/br,n/bg,n/w,n/g,w/b,w+/b,rb+/b"
- #ifdef COMMANDER
- b:SKIPBLOCK:={ | nMove | ArraySkip( nLenArray, @nArrPos, nMove ) }
- #else
- b:SKIPBLOCK:={ | nMove | SkipArray( nMove, @nArrPos, nLenArray ) }
- #endif
-
- c:= TBColumnNew( " FILE NAME", ;
- { || PADR( IF( Len( aPacked[ nArrPos, F_NAME_LONG ] ) <> ;
- Len( aPacked[ nArrPos, F_NAME ] ), CHR( 7 ), " " ) + ;
- aPacked[ nArrPos, F_NAME ], 14 ) } ;
- )
- c:colorBlock:={ || {1,1} }
- c:WIDTH := 14
- b:ADDCOLUMN( c )
-
- c:=TBColumnNew(" DATE",{ || PADC(aPacked[ nArrPos,F_DATE ],10) })
- c:colorBlock:={|| {1,1} }
- c:WIDTH := 10
- b:ADDCOLUMN( c )
-
- c:= TBColumnNew(" TIME",{ || PADC( aPacked[ nArrPos,F_TIME ], 7 )})
- c:colorBlock:={ || {1,1} }
- c:WIDTH := 7
- b:ADDCOLUMN( c )
-
- c:=TBColumnNew(" ORIGINAL",{|| STR(aPacked[nArrPos,F_ORIGINAL],9,0)+ " "})
- c:colorBlock:={ || {1,1} }
- c:WIDTH := 10
- b:ADDCOLUMN( c )
-
- c:=TBColumnNew(" PACKED",{|| STR(aPacked[nArrPos,F_PACKED],9,0)+" " } )
- c:colorBlock:={ || {1,1} }
- c:WIDTH := 10
- b:ADDCOLUMN( c )
-
- c:=TBColumnNew("RATIO",{ || aPacked[ nArrPos, F_RATIO ] } )
- c:colorBlock:={ || {1,1} }
- c:WIDTH := 5
- b:ADDCOLUMN( c )
-
- c:=TBColumnNew(" TYPE",{ || aPacked[ nArrPos, F_COMPRESS ] } )
- c:colorBlock:={ || {1,1} }
- c:WIDTH := 10
- b:ADDCOLUMN( c )
-
- for jj:=1 to b:colCount
- b:getcolumn(jj):defcolor:={10,10}
- next
-
- // Returns the right and left boundaries of the browse
- nLeftCol := b:nLEFT
- nRightCol:= b:nRIGHT
-
- nKey := 0
-
- WHILE .T.
- b:colorRect( { b:rowPos, 1, b:rowPos, b:colCount}, {9,9}, {1,1} )
- STABILIZE b
- if b:stabilize()
- b:colorRect( { b:rowPos,1,b:rowPos,b:colCount}, {9,9}, {2,2} )
- TMARKER( b:rowPos+3, 3, b:rowPos+3, maxcol()-5, 14 )
- ScrollBarUpdate(TBar_,nArrPos,nLenArray,TRUE)
- WHILE ((nKey := WKEY(.1)) == 0)
- TICK_TAPE()
- END
- endif
- DO CASE
- CASE nKey EQ K_DOWN
- b:DOWN()
- CASE nKey EQ K_UP
- b:UP()
- CASE nKey EQ K_PGDN
- b:PAGEDOWN()
- CASE nKey EQ K_PGUP
- b:PAGEUP()
- CASE nKey EQ K_ENTER
- IF !EMPTY( IsInPath( "LIST.COM") )
- ViewIt(aPacked[ nArrPos, F_NAME_LONG ],cWhichFile)
- ENDIF
- CASE nKey EQ K_SPACEBAR
- IF !EMPTY( IsInPath( "PKUNZIP.EXE" ) )
- IF !EMPTY( IsInPath( "LIST.COM" ) )
- Decomp(aPacked[ nArrPos, F_NAME_LONG ],cWhichFile)
- ENDIF
- ENDIF
- CASE nKey EQ K_F10
- setcolor(cDefColor)
- EXIT
- CASE nKey EQ K_F1 .OR. nKey EQ K_ESC
- #ifdef USE_HELP
- DO_HELP()
- #endif
- ENDCASE
- ENDDO
- return nil
-
- #ifdef USE_HELP
- FUNCTION DO_HELP
- local SaveFullScreen(), oldcolor:=setcolor("W+/R"), nKey:=0
- ZoomBox(1,2,19,73,"W+/R",14,.T.)
- @ 2,4 say " ENTER -"
- @ 3,4 say " SPACEBAR -"
- @ 4,4 say " F10 -"
- @ 6,4 say " ABOUT THIS PROGRAM"
- @ 7,4 say "ORIGINAL PROGRAMMER:"
- @ 8,4 say " MODIFICATIONS BY:"
- @ 9,4 say "LANGAUAGE/LIBRARIES:"
-
- setcolor("gr+/r")
- @ 2,25 say "View highlighted file"
- @ 3,25 say "Extract highlighted file"
- @ 4,25 say "Exit this program"
- @ 7,25 say "Micheal Todd Charron"
- @ 8,25 say "Kevin Sean Gallagher"
- @ 9,25 say "Clipper 5.01 Nanfor.lib"
-
- setcolor("w+/r")
- @11,4 say "Any modifications must retain the above names as well as a list of"
- @12,4 say "changes made to the source code."
-
- @13,4 say "When [spacebar] is pressed to extracted a file, pkunzip.exe is"
- @14,4 say "called to do the decompression, and pkunzip must be in the PATH to"
- @15,4 say "work."
-
- @16,4 say "When [enter] is pressed to view the current highlighted file"
- @17,4 say "an external utility LIST.COM is called to do the viewing, and must"
- @18,4 say "be within the DOS PATH for this program to find it."
-
- @MR,0 say PADC("PRESS ANY KEY TO EXIT HELP",80) color "W+/B"
- nKey:=INKEY(30)
- setcolor(oldcolor)
- RestFullScreen()
- return nil
- #endif
-
- /*
- * Do not fully rely on this function since it mixes PKzip's
- * Warning and errorlevels together. The Blinker Swap errorchecking
- * routine can not tell one from the other!
- */
- function ZipTest( nParm )
- local nErr :=0, cErr,aArray_:={ ;
- "00 NO ERRORS", ;
- "01 FATAL ERROR;FILE HAS BAD TABLE", ;
- "02 FATAL ERROR;FILE HAS BAD TABLE", ;
- "03 FATAL ERROR;FILE HAS BAD TABLE", ;
- "04 INSUFFICIENT MEMORY" , ;
- "11 DO NOT KNOW HOW TO HANDLE THIS FILE; PKUNZIP ERROR #11" , ;
- "12 SKIPPED ENCRYPTED FILE PKUNZIP ERROR #12", ;
- "13 FILE DOES NOT EXIST;OR;POSSIBLE DOS I/O ERROR" , ;
- "14 INSUFFICIENT DISKSPACE;OR;DISK FULL." , ;
- "15 FAILED CRC CHECK" , ;
- "17 ATTEMPT TO COMPRESS TO MANY FILES;OR;CORRUPT FILE HEADER" , ;
- "24 FATAL EMS ERROR" , ;
- "25 FATAL EMS ERROR" , ;
- "26 ONE OR MORE ERRORS DETECTED;CAN NOT CONTINUE" , ;
- "50 DISK FULL;DELETE SOME FILES AND RETRY" }
-
- nErr := ASCAN(aArray_,sBlock)
- /*
- * Any number returned greater than 1 indicates a known error!
- * If "1" is returned then we have success
- * If "0" is returned the error was not located in the error array
- */
- DO CASE
- CASE nErr EQ 1 ; cErr:=""
- CASE nErr EQ 0 ; cErr:= "UNKNOW ERROR OCCURED"
- OTHERWISE ; cErr:= SUBS(aArray_[nErr],4)
- ENDCASE
- return cErr
-
- STATIC FUNCTION TICK_TAPE()
- LOCAL TBM := " Press F10 to exit - Press F1 for help "
- LOCAL Xl1 := LEN(TBM)
- LOCAL Xl2 := Xl1 - 1
- STATIC w := 0, nCnt:= 0
-
- SetPos(1,((80-Xl1)/2));DispOut( TBM, "GR+/B")
- SetPos(1,((80-Xl1)/2)+nCnt);DispOut(SUBS(TBM,nCnt+1,1),TBc[++w%12+1]+'/B')
-
- w :=IF( w > 11, 0, w)
- nCnt:=IF(++nCnt > Xl2,0,nCnt)
-
- return nil
-
-
-